﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//左移操作符
//int main()
//{
//	int a = 10;
//	int b = a >> 1;//除2
//	int c = a << 1;//相乘2
//	printf("%d %d\n", b, c);
//	return 0;
//}
//不能创建临时变量（第三个变量），实现两个整数的交换
//int main()
//{
//	int a = 10;
//	int b = 5;
//	printf("交换前%d %d\n", a, b);
//	//a^a结果为0，相同为0，不同为1
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("交换后%d %d", a, b);
//	return 0;
//}
//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//int main()
//{
//	int num = 0;
//	int count = 0;
//	scanf("%d", &num);//类似于求出10进制数的每一位数
//	while (num)
//	{
//		if (num % 2 == 1)//如果每次最后位数是1的就进行++
//		{
//			count++;
//		}
//		num /= 2;
//	}
//	printf("%d\n", count);
//	return 0;
//}
//但是如果是负数的话结果是不对的
//下面运用>>操作符来计算，可以计算负数
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int i = 0;
//	int count = 0;
//	for (i = 0;i < 32;i++)
//	{
//		if ((num >> i)&1)//最后一位二进制位数为1进行++
//		{
//			count++;
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}
//int main()
//{
//	int num = 0;
//	int count = 0;
//	scanf("%d", &num);
//	while (num)//有几个1进行几次循环
//	{
//		count++;
//		num = num & (num - 1);//把最右边的1消失
//	}
//	printf("%d\n", count);
//	return 0;
//}
//编写代码将13⼆进制序列的第5位修改为1，然后再改回0
//int main()
//{
//	int n = 13;
//	int a = n | (1 << 4);//	让1中的1移动到第五位置进行或处理
//	int b = a & (~(1 << 4));
//	printf("%d\n%d\n", a, b);
//	return 0;
//}
//假设在C语言中，有两个整数变量x = 9和y = 3，表达式x ^ y的结果是什么
//9  -  1001
//3  -  0011
//9^3   1010
//int main()
//{
//	/*int x = 9;
//	int y = 3;
//	printf("%d\n", x ^ y);*/
//
////两个整数变量a = 12和b = 5，表达式a & b的结果是什么？
////12 - 1100
////5 -  0101
//	// 0100
//	int a = 12;
//	int b = 5;
//	printf("%d\n", a & b);
//	return 0;
//}
// //将十进制数-5转换为8位二进制补码时
// -5  10000101
//     11111010
//     11111011
//递归和非递归分别实现求n的阶乘（不考虑溢出的问题）

////递归
////int fac(int n)
////{
////	if (n == 1)
////	{
////		return 1;
////	}
////	return n * fac(n - 1);
////}
////非递归
//int fac(int n)
//{
//	int i = 0;
//	int ret = 1;
//	for (i = 1;i <= n;i++)
//	{
//		ret *= i;
//	}
//	return ret;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = fac(n);
//	printf("%d\n", ret);
//	return 0;
//}
//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	for (i = 0;i < 10;i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	for (i = 0;i < 10;i++)
//	{
//		int j = 0;
//		int flag = 0;
//		for (j = 0;j < 10;j++)
//		{
//			if ((arr[i] == arr[j]) && (i != j))
//			{
//				flag = 1;
//				break;
//			}
//		}
//		if (flag == 0)
//		{
//			printf("%d ", arr[i]);
//		}
//	}
//	return 0;
//}
//输入两个整数，求两个整数二进制格式有多少个位不同
// 取出二进制的每一位进行比较
//int main()
//{
//	int m = 0;
//	int n = 0;
//	scanf("%d %d", &m, &n);
//	int i = 0;
//	int count = 0;
//	for (i = 0;i < 32;i++)
//	{
//		//每次取出一位二进制位进行比较
//		if (((n >> i) & 1) != ((m >> i)&1))
//		{
//			count++;
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}
//利用^ 二进制位相同位0，不同为1，统计1二进制位数
//int main()
//{
//	int m = 0;
//	int n = 0;
//	scanf("%d %d", &m, &n);
//	int count = 0;
//	int tem = m ^ n;
//	while (tem)
//	{
//		count++;
//		tem = tem & (tem - 1);//每次去掉最右边的1
//	}
//	printf("%d\n", count);
//	return 0;
//}
//获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int i = 0;
//	for (i = 31;i > 0;i -= 2)
//	{
//		printf("%d ", (n >> i) & 1);
//	}
//	for (i = 30;i >= 0;i -= 2)
//	{
//		printf("%d ", (n >> i) & 1);
//	}
//	return 0;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		count++;
//		n = n & (n - 1);
//	}
//	printf("%d\n", count);
//	return 0;
//}
//逗号表达式
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);
//	//              a=12           b=13
//	//前面的运算结果可能会影响后面的值，结果是最后一个表达式的值
//	printf("%d\n", c);
//	return 0;
//}
//#include<string.h>
//struct stu
//{
//	char name[20];
//	int age;
//};
//int main()
//{
//	struct stu s1 = { "zhangsan",20 };//z这种初始化要对应顺序
//	struct stu s2 = { .age = 18,.name = "zhangsan" };//不要对应顺序
//	printf("%s %d\n", s1.name, s1.age);
//	struct stu* ptr = &s1;
//	strcpy(ptr->name, "laoliu");//字符串拷贝
//	ptr->age = 12;
//	printf("%s %d\n", s2.name, s2.age);
//	printf("%s %d\n", ptr->name, ptr->age);
//}
//#include <stdio.h>
//int main()
//{
//    int arr[] = { 1,2,3,4,5 };
//    short* p = (short*)arr;
//    int i = 0;
//    for (i = 0; i < 4; i++)
//    {
//        *(p + i) = 0;
//    }
//
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}
//整型提升
//不满足一个int 类型的会进行补充
//补充符号位
//int main()
//{
//	char a = 4;
//	//000000000000000000000 a - 00000100
//	//前面补充0
//	char b = 3;
//	//b- 00000011
//	//000000000000000000000000000011
//	//
//	//c - 00000111
//	//000000000000000000000000000111
//	//结果为7
//	char c = a + b;
//	printf("%d\n", c);
//	return 0;
//}
//64位平台的结果是8
//32位平台的结果是4
//int main()
//{
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(double*));
//	return 0;
//}
//int main()
//{
//	int n = 0x11223344;
//	char* pc = (char*)&n;
//	*pc = 0;
//	printf("%p\n", &pc);
//	return 0;
//}
//int main()
//{
//	int n = 10;
//	char* pc = (char*)&n;
//	int* pi = &n;
//	//n pc pi的地址相同指向n的起始位置
//	printf("%p\n", &n);
//	printf("%p\n", pc);
//	printf("%p\n", pc + 1);//char* 类型每次跳过一个字节
//	printf("%p\n", pi);
//	printf("%p\n", pi + 1);//每次跳过4个字节
//	return 0;
//}
//int main()
//{
//	int a = 10;
//	char ch = 'm';
//
//	int* pa = &a;
//	char* pc = &ch;
//	*pa = 20;
//	printf("%d\n", a);
//	return 0;
//}